#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
PDF科技文献总结工具
功能：批量处理PDF科技文献，使用大模型进行内容总结，并输出到Markdown文件

版本: 2.0.0
作者: 陈振玺
"""

import argparse
from pathlib import Path
from .pdf_processor.pdf_summarizer import PDFSummarizer as PDFProcessor


def main():
    """
    命令行主函数
    """
    parser = argparse.ArgumentParser(
        description='PDF科技文献总结工具 - 批量处理PDF文献并生成总结报告',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
说明:
  该工具支持多种大模型API服务，包括OpenAI、Ollama等本地服务。
  
  对于Ollama本地服务：
    1. 确保Ollama服务正在运行
    2. 不需要提供API密钥
    3. 默认使用 http://localhost:11434/v1 作为API地址
    4. 指定要使用的模型名称（如 llama2、mistral等）
  
示例用法:
  %(prog)s /path/to/pdf/directory
  %(prog)s /path/to/pdf/directory -o summary_report.md
  %(prog)s /path/to/pdf/directory --model llama2  # 使用Ollama的llama2模型
  %(prog)s /path/to/pdf/directory --api-base http://localhost:11434/v1 --model mistral
  %(prog)s /path/to/pdf/directory --api-key sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  # 使用OpenAI
  %(prog)s /path/to/pdf/directory --max-retries 5
  %(prog)s /path/to/pdf/directory --print-output  # 将模型输出打印到控制台
  %(prog)s /path/to/pdf/directory --chunk-size 4000  # 设置文本块大小为4000字符
  %(prog)s /path/to/pdf/directory --output-format all  # 生成所有格式的报告
        """
    )
    
    parser.add_argument(
        'input_directory',
        help='包含PDF文件的输入目录路径'
    )
    
    parser.add_argument(
        '-o', '--output',
        default='pdf_summary_report.md',
        help='输出Markdown报告文件路径 (默认: pdf_summary_report.md)'
    )
    
    parser.add_argument(
        '--api-key',
        help='OpenAI API密钥 (对于Ollama等本地服务可不提供)'
    )
    
    parser.add_argument(
        '--model',
        help='使用的模型名称 (默认: gpt-3.5-turbo，对于Ollama可使用 llama2、mistral等)'
    )
    
    parser.add_argument(
        '--config',
        help='配置文件路径 (默认查找 ~/.pdf_summarizer_config.json)'
    )
    
    parser.add_argument(
        '--max-retries',
        type=int,
        default=3,
        help='最大重试次数 (默认: 3)'
    )
    
    parser.add_argument(
        '--api-base',
        help='API基础URL (对于Ollama默认使用 http://localhost:11434/v1)'
    )
    
    parser.add_argument(
        '--version',
        action='version',
        version='PDF科技文献总结工具 2.0.0 (作者: 陈振玺)'
    )
    
    parser.add_argument(
        '--print-output',
        action='store_true',
        help='将模型输出打印到控制台'
    )
    
    parser.add_argument(
        '--chunk-size',
        type=int,
        default=3000,
        help='文本分块大小（字符数）(默认: 3000) [已弃用]'
    )
    
    parser.add_argument(
        '--output-format',
        choices=['md', 'json', 'txt', 'all'],
        default='md',
        help='输出格式: md (Markdown), json (JSON), txt (文本), all (所有格式) (默认: md)'
    )
    
    parser.add_argument(
        '--interactive',
        action='store_true',
        help='启用交互模式，每个PDF处理完后等待用户确认'
    )
    
    args = parser.parse_args()
    
    try:
        # 创建总结器实例
        summarizer = PDFProcessor(
            api_key=args.api_key, 
            model=args.model,
            config_file=args.config,
            max_retries=args.max_retries,
            api_base=args.api_base,
            print_output=args.print_output,
            interactive=args.interactive
            # chunk_size 参数已移除
        )
        
        # 处理PDF文件
        input_dir = Path(args.input_directory)
        if not input_dir.exists():
            raise FileNotFoundError(f"输入目录不存在: {input_dir}")
        
        if not input_dir.is_dir():
            raise NotADirectoryError(f"输入路径不是目录: {input_dir}")
        
        summaries = summarizer.process_pdfs(input_dir)
        
        # 生成报告
        output_file = Path(args.output)
        
        # 根据指定的格式生成输出
        if args.output_format in ['md', 'all']:
            summarizer.report_generator.generate_markdown_report(
                summaries, output_file, summarizer.model, summarizer.api_base, summarizer.max_retries
            )
        
        if args.output_format in ['json', 'all']:
            json_output = output_file.with_suffix('.json')
            summarizer.report_generator.save_summaries_as_json(summaries, json_output)
        
        if args.output_format in ['txt', 'all']:
            txt_output = output_file.with_suffix('.txt')
            summarizer.report_generator.save_summaries_as_txt(summaries, txt_output)
        
        print(f"\n处理完成!")
        print(f"处理文件数: {len(summaries)}")
        print(f"使用模型: {summarizer.model}")
        print(f"API地址: {summarizer.api_base or '默认Ollama本地服务'}")
        print(f"最大重试次数: {summarizer.max_retries}")
        
        if args.output_format == 'all':
            print(f"报告文件 (MD): {output_file}")
            print(f"报告文件 (JSON): {output_file.with_suffix('.json')}")
            print(f"报告文件 (TXT): {output_file.with_suffix('.txt')}")
        else:
            extension = {
                'md': '.md',
                'json': '.json',
                'txt': '.txt'
            }.get(args.output_format, '.md')
            print(f"报告文件: {output_file.with_suffix(extension)}")
        
    except Exception as e:
        print(f"错误: {e}")
        return 1
    
    return 0


if __name__ == '__main__':
    exit(main())